
;boot程序，加载用户程序
;@auth Mike/Fang.j/Q184377367

;不要问为什么在0x7c00,说白了，硬件编址决定的
;用10进制来描述的话，假设0123456789 10个地址，前九个地址CPU给了其他的硬件，
;那你就只能从9开始写入代码了

org 0x7C00    ;主引导记录的内存地址

jmp short entry

  BS_OEMName	db	'ffosboot'
	BPB_BytesPerSec	dw	0x200
	BPB_SecPerClus	db	0x8
	BPB_RsvdSecCnt	dw	0x1
	BPB_NumFATs	db	0x2
	BPB_RootEntCnt	dw	0xe0
	BPB_TotSec16	dw	0x7d82
	BPB_Media	db	0xf0
	BPB_FATSz16	dw	0xc
	BPB_SecPerTrk	dw	0x3f
	BPB_NumHeads	dw	0xff
	BPB_hiddSec	dd	0
	BPB_TotSec32	dd	0
	BS_DrvNum	db	0
	BS_Reserved1	db	0
	BS_BootSig	db	29h
	BS_VolID	dd	0
	BS_VolLab	db	'boot loader'
	BS_FileSysType	db	'FAT12'



entry:
  mov ah,0fh
  mov al,0ah
  int 10h

  mov ax, 0
  mov ss, ax
  mov ds, ax
  mov es, ax
  mov si, msg    ;将msg地址赋给si

putLoop:
  mov al, [si]    ;等同 mov al, byte [si]  将si地址开始的一个字节的值放入al中
  add si, 1    ;si = si+1
  cmp al, 0    ;al与0比较
  je pause        ;如上面比较相等 则跳转到fin 不相等则不跳转,执行后面命令
  mov ah, 0x0e
  int 0x10
  jmp putLoop
  
 pause:
    ;软盘复位
  ;mov ah,00h
  ;mov dl,00h
  ;int 13h


  mov ax,0
  mov es,ax
  mov bx,200H
  
  mov al,1
  mov ch,0
  mov cl,1
  mov dl,0
  mov dh,0
  mov ah,2
  int 13h



  HLT  ;暂停
  jmp pause
  
 msg:
  DB 0x0a, 0x0a
  DB "fos start boot...."
  ;DB 0
  times 510-($-$$) db 0;填充510字节的0，$$表示编译后的起始地址
  dw 0xaa55 ;表示结束，加上前面的510字节正好512字节满足条件